package br.com.mauricioreis.db;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;

public class Medida extends Entidade {
    public static final String DATABASE_TABLE = "medida";
    public static final String TABLE_CREATE = "create table medida (id integer primary key autoincrement, "
            + "nome text not null, descricao text not null); ";

    private static final String[] COLUMNS = new String[] { GenericDAO.KEY_ID, "nome", "descricao" };
    public static final String NOME_MEDIDA_PADRAO = "grama";
    public static final String DESCRICAO_MEDIDA_PADRAO = "Medida Padrão do Sistema";
    public static final String SQL_MEDIDA_PADRAO = "INSERT INTO medida (nome, descricao) VALUES ('" + Medida.NOME_MEDIDA_PADRAO + "' , '"
            + Medida.DESCRICAO_MEDIDA_PADRAO + "');";
    private int id;
    private String nome;
    private String descricao;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public static Long incluir(Activity atividade, Medida medida) {

        GenericDAO dao = obtemDao(atividade);
        Long id = null;
        if (dao != null) {
            ContentValues values = toContentValues(medida);
            id = dao.inserir(DATABASE_TABLE, values);
            dao.close();
        }
        return id;
    }

    public static void editar(Activity atividade, Medida medida) {
        GenericDAO dao = obtemDao(atividade);
        ContentValues values = toContentValues(medida);
        dao.atualizar(DATABASE_TABLE, medida.getId(), values);

    }

    public static void excluir(Activity atividade, Medida medida) {
        GenericDAO dao = obtemDao(atividade);
        dao.deletar(DATABASE_TABLE, medida.getId());
    }

    public static Medida consultar(Activity atividade, Medida medida) {
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.get(DATABASE_TABLE, COLUMNS, medida.getId());
        medida = cursorParaMedida(cursor);
        return medida;
    }

    private static Medida cursorParaMedida(Cursor cursor) {
        // Se o cursor está vazio, retorna nulo
        if (cursor.getCount() == 0) {
            return null;
        }
        Medida medida = new Medida();
        int idColumn = cursor.getColumnIndex(GenericDAO.KEY_ID);
        int nomeColumn = cursor.getColumnIndex("nome");
        int descricaoColumn = cursor.getColumnIndex("descricao");
        medida.setId(cursor.getInt(idColumn));
        medida.setNome(cursor.getString(nomeColumn));
        medida.setDescricao(cursor.getString(descricaoColumn));

        return medida;
    }

    public static List<Medida> listar(Activity atividade, Medida medida) {
        Cursor cursor = null;
        List<Medida> list = new ArrayList<Medida>();
        GenericDAO dao = obtemDao(atividade);

        if (dao != null) {
            cursor = dao.get(DATABASE_TABLE, COLUMNS);
            if (cursor != null && cursor.moveToFirst()) {
                int count = cursor.getCount();
                for (int i = 0; i < count; i++) {
                    Medida medidaRet = cursorParaMedida(cursor);

                    list.add(medidaRet);
                    cursor.moveToNext();
                }
            }
        }
        return list;
    }

    /**
     * Lista as medidas associadas com o alimento passado por parametro
     * 
     * @param atividade
     * @param alimento
     *            alimento com o id setado
     * @param medidasAssociadas
     *            se true, lista todas as medidas associadas ao alimento se false, lista todas as medidas não associadas
     * @return
     */
    public static List<Medida> listarMedidasAssociadas(Activity atividade, Alimento alimento, Boolean medidasAssociadas) {
        Cursor cursor = null;
        List<Medida> list = new ArrayList<Medida>();
        GenericDAO dao = obtemDao(atividade);
        // Se foi possivel Obter o DAO
        if (dao != null) {
            // Monta SQL de medidas associadas
            String filtroAssociadaSimOuNao = null;
            // Se tiver que procurar medidas associadas, procura por medidas que estão associadas ao alimento informado
            if (medidasAssociadas) {
                filtroAssociadaSimOuNao = " IN ";
                // Se tiver que procurar medidas não associadas, procura por medidas que não estão associadas ao alimento informado
            } else {
                filtroAssociadaSimOuNao = " NOT IN";
            }
            String sql = "SELECT m.* FROM medida m" + //
                                                      // IN ou NOT IN
                    " WHERE m.id " + filtroAssociadaSimOuNao + //
                    " (SELECT id_medida FROM medida_alimento WHERE id_alimento = " + alimento.getId() + ")	" + //
                    " AND m.nome NOT LIKE '" + NOME_MEDIDA_PADRAO + "'";

            cursor = dao.getComQuery(sql, null);
            if (cursor != null && cursor.moveToFirst()) {
                int count = cursor.getCount();
                for (int i = 0; i < count; i++) {
                    Medida medidaRet = cursorParaMedida(cursor);

                    list.add(medidaRet);
                    cursor.moveToNext();
                }
            }
        }
        return list;
    }

    private static ContentValues toContentValues(Medida medida) {
        ContentValues values = new ContentValues();
        values.put("nome", medida.getNome());
        values.put("descricao", medida.getDescricao());
        return values;
    }

    @Override
    public String toString() {
        return nome;
    }

    private static GenericDAO obtemDao(Activity atividade) {
        return GenericDAO.getInstance(atividade, DATABASE_NAME, TABLE_CREATE, DATABASE_TABLE, DATABASE_VERSION);
    }

    public static Medida consultarPorNome(Activity atividade, String nomeMedida) {
        String where = "nome like '" + nomeMedida + "'";
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.getComWhere(Medida.DATABASE_TABLE, COLUMNS, where);
        return cursorParaMedida(cursor);
    }

}
